'''备份文件用的脚本.本文件为文件过滤器,用于找出符合备份时间段的文件.
使用方法为:指定一个根目录,以及一个时间段.
找出该根目录(含子目录)下的所有文件中,创建时间与最后修改时间的较大者处于指定时间段的文件.
对这些文件进行备份.
目前的备份方法是生成三个文本文件,分别是logFiles.txt,logDirs.txt,logInfo.txt,
记录所有找出来的文件,所有目录,以及备份的基本信息,这3个文件都是用utf8带bom进行
编码,在python中的编码就是utf_8_sig.
本脚本只做到记录这一步.另外写脚本进行复制,也可以写脚本进行其他压缩打包等操作.
注意目录记录是有顺序的,方便访问并以此生成新的对应目录.

使用脚本Main_rar进行rar备份(推荐),或Main_zip进行zip备份.
前者需要安装rar,后者则是python自带的zip压缩.
'''

import os
import time
import sys

import MyPrint

class FileFilter:
  
  ## 通过指定根目录,开始时间,结束时间(时间格式为"%Y-%m-%d %H:%M:%S")指定备份范围,
  ## 并指定生产的记录文件(默认为当前目录下的logFiles.txt, 目录表文件logDirs.txt(用于备份时生成对应目录), 
  ## 备份设定信息logInfo.txt
  def __init__(self, rootDir, startTime, endTime, 
    logFiles = sys.path[0]+'\\logFiles.txt', logDirs = sys.path[0]+'\\logDirs.txt', 
    logInfo = sys.path[0]+'\\logInfo.txt'):
    # 复制参数
    self._rootDir = rootDir
    self._startTime = startTime
    self._endTime = endTime
    self._logFiles = logFiles
    self._logDirs = logDirs
    self._logInfo = logInfo
    # 需要备份的文件表
    self._fileList = []
    # 目录表
    self._dirList = []
    # 真正的开始,结束时间
    self._realStart = time.mktime(time.strptime(self._startTime, "%Y-%m-%d %H:%M:%S"))
    self._realEnd = time.mktime(time.strptime(self._endTime, "%Y-%m-%d %H:%M:%S"))
    return
  
  ## 指定一个文件的完整路径,检查是否符合备份标准
  def _checkFile(self, fpath):
    if(not os.path.isfile(fpath)):
      return False
    mtime = os.path.getmtime(fpath) # 修改时间
    ctime = os.path.getctime(fpath) # 创建时间
    lastTime = max(mtime,ctime)
    if ((lastTime < self._realStart) or (lastTime > self._realEnd)):
      return False
    return True
    
  ## 主方法,遍历根目录,写入记录文本
  def main(self):
    for rt, dirs, files in os.walk(self._rootDir):
      for f in files:
        fpath = rt + '\\' +f
        if (self._checkFile(fpath)):
          self._fileList.append(fpath)
      for d in dirs:
        self._dirList.append(rt+'\\'+d)
        
    # 写入基本信息日志
    text = 'rootDir='+self._rootDir+'\nstartTime='+self._startTime+'\nendTime='+self._endTime
    with open(self._logInfo, 'wb') as f:
      f.write(text.encode('utf_8_sig'))
    print('备份信息写入完成:')
    #os.system("ECHO {}".format(text))
    MyPrint.myPrint(text)
    print('='*20)
    # 写入目录记录
    text = '\n'.join(self._dirList)
    with open(self._logDirs, 'wb') as f:
      f.write(text.encode('utf_8_sig'))
    print('目录文件查找完成:')
    #os.system("ECHO {}".format(text))
    MyPrint.myPrint(text)
    print('='*20)
    # 写入备份文件记录
    text = '\n'.join(self._fileList)
    with open(self._logFiles, 'wb') as f:
      f.write(text.encode('utf_8_sig'))
    print('备份文件记录完成:')
    #os.system("ECHO {}".format(text))
    MyPrint.myPrint(text)
    print('='*20)
    # 完成
    print('备份准备与信息记录全部完成!')
    return
    
## 开始
if __name__ == '__main__':
  rootDir = r'D:\MyDocument\MyNote'
  startTime = "2017-11-13 1:1:1"
  endTime = "2018-11-13 15:1:1"
  ff = FileFilter(rootDir ,startTime, endTime)
  ff.main()